package com.lfz.demo.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.lfz.demo.common.Result;
import com.lfz.demo.entity.User;
import com.lfz.demo.service.SmsService;
import com.lfz.demo.service.UserService;
import com.lfz.demo.vo.DataView;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

@RestController
@RequestMapping("/findPwd")
public class FindPwdController {

    private static final Logger logger = LoggerFactory.getLogger(FindPwdController.class);

    @Autowired
    private RedisTemplate<String, String> redisTemplate;
    // 模拟短信服务（实际需对接短信平台）
    @Autowired
    private SmsService smsService; // 依赖注入自动处理
    @Autowired
    private UserService userService;


    /**
     * 1、验证当前找回密码用户是否存在
     */
    @PostMapping("/checkUserExists")
    public DataView checkUserExists(@RequestParam String username) {
        DataView dataView = new DataView();
        int count = userService.countByUsername(username);
        if (count > 0) {
            dataView.setCode(200);
            dataView.setMsg("用户存在，继续操作");
            String phone = userService.phoneByUsername(username);
            // 将手机号添加到返回的数据中
            Map<String, Object> extraData = new HashMap<>();
            extraData.put("phone", phone);
            dataView.setData(extraData);
        } else {
            dataView.setCode(100);
            dataView.setMsg("用户名不存在，请重新输入！");
        }
        return dataView;
    }

    /**
     * 2、判断输入图片验证码对不对
     */
    @PostMapping("/checkCode")
    public DataView checkCode(String code, HttpSession session){
        DataView dataView = new DataView();
        // 获取验证码
        String sessionCode = (String) session.getAttribute("code");

        // 判断输入验证码是否和图片中一致
        // 判断 sessionCode 是否为 null
        if (sessionCode == null) {
            dataView.setCode(100);
            dataView.setMsg("验证码已过期，请刷新重试！");
        } else if (sessionCode.equals(code)){
            dataView.setCode(200);
            dataView.setMsg("验证码正确，继续操作！");
        } else {
            dataView.setCode(100);
            dataView.setMsg("验证码错误，请刷新重试！");
        }
        return dataView;
    }

    /**
     * 3-1、校验手机号是否已注册
     * @param phone
     * @return
     */
    @PostMapping("/checkPhone")
    public DataView checkPhone(@RequestParam String phone) {
        DataView dataView = new DataView();
        try {
            User user = userService.getOne(new QueryWrapper<User>().eq("phone", phone));
            if (user != null) {
                dataView.setCode(200);
                dataView.setMsg("手机号已注册");
            } else {
                dataView.setCode(101);
                dataView.setMsg("该手机号未注册，请先注册");
            }
        } catch (Exception e) {
            logger.error("校验手机号失败，手机号：{}", phone, e);
            dataView.setCode(500);
            dataView.setMsg("校验手机号失败，请稍后重试");
        }
        return dataView;
    }

    /**
     * 3-1.1、手机验证码发送
     */
    @PostMapping("/sendCode")
    public Result sendCode(@RequestParam String phone) {
        // 生成6位验证码
        String code = String.format("%06d", (int) (Math.random() * 1000000));
        // 模拟发送短信
        smsService.sendSms(phone, "验证码：" + code);
        // 记录日志
//        logger.info("Sent SMS to {} with code {}", phone, code);
        // 缓存验证码（有效期5分钟）
        redisTemplate.opsForValue().set("find_pwd:" + phone, code, 5, TimeUnit.MINUTES);
        return Result.success("验证码发送成功，有效期5分钟，请尽快输入！");
    }

    /**
     * 3-1.2、判断手机验证码是否正确
     */
    @PostMapping("/checkSmsCode")
    public Result checkSmsCode(@RequestParam String phone, @RequestParam String inputCode) {
        // 从 Redis 中获取缓存的验证码
        String cachedCode = redisTemplate.opsForValue().get("find_pwd:" + phone);

        // 判断验证码是否存在
        if (cachedCode == null) {
            return Result.fail("验证码已过期，请重新获取");
        }

        // 比较验证码
        if (cachedCode.equals(inputCode)) {
            return Result.success("验证码验证成功");
        } else {
            return Result.fail("验证码输入错误");
        }
    }

    /**
     * 3-2、资料辅助验证
     */
    @PostMapping("/checkInfo")
    public DataView checkInfo(
            @RequestParam String username,
            @RequestParam String name,
            @RequestParam String idCard,
            @RequestParam String address
    ) {
        DataView dataView = new DataView();
        try {
            // 1. 获取数据库中的正确资料
            Map<String, String> correctInfo = userService.infoByUsername(username);

            // 2. 防御性校验：用户是否存在资料
            if (correctInfo == null || correctInfo.isEmpty()) {
                dataView.setCode(100);
                dataView.setMsg("该账号未绑定资料辅助验证信息，请更换验证方式");
                return dataView;
            }

            // 3. 提取数据库中的字段（注意键名与 Mapper 返回一致）
            String dbName = correctInfo.get("name");
            String dbIdCard = correctInfo.get("idCard"); // 对应 SQL 别名 idCard
            String dbAddress = correctInfo.get("address");

            // 4. 校验用户输入与数据库信息是否一致
            boolean isValid =
                    name.equals(dbName) &&
                            idCard.equals(dbIdCard) &&
                            address.equals(dbAddress);

            if (isValid) {
                dataView.setCode(200);
                dataView.setMsg("资料验证通过");
            } else {
                dataView.setCode(101);
                dataView.setMsg("输入的资料与注册信息不一致，请重新填写");
            }

        } catch (Exception e) {
            dataView.setCode(500);
            dataView.setMsg("服务器异常，请稍后再试");
            e.printStackTrace();
        }
        return dataView;
    }

    /**
     * 4、重新设置密码
     */
    @PostMapping("/resetPwd")
    public Result resetPwd(
            @RequestParam String phone,
            @RequestParam String code,
            @RequestParam String newPassword, // 新增参数，接收前端传来的新密码
            @RequestParam String verifyType,
            @RequestParam(required = false) String username
            ) {
        User user = null;
        if ("phone".equals(verifyType)) {
            // 手机号验证方式
            // 校验验证码
            String cacheCode = redisTemplate.opsForValue().get("find_pwd:" + phone);
            if (!code.equals(cacheCode)) {
                return Result.fail("验证码错误");
            }
            // 查询用户（根据手机号查询）
            user = userService.getOne(new QueryWrapper<User>().eq("phone", phone));
        } else if ("info".equals(verifyType)) {
            // 资料验证方式
            if (username == null || username.isEmpty()) {
                return Result.fail("用户名不能为空");
            }
            // 查询用户（根据用xxxxxxxxxxxxxxx户名查询）
            user = userService.getOne(new QueryWrapper<User>().eq("username", username));
        } else {
            return Result.fail("不支持的验证方式");
        }

        if (user == null) {
            return Result.fail("用户不存在");
        }

        // 简单的密码强度检查示例，要求密码至少6位
        if (newPassword.length() < 6) {
            return Result.fail("密码长度至少为6位");
        }

        // 重置密码
        user.setPassword(newPassword);
        userService.updateById(user);
        return Result.success("密码重置成功");
    }

}